/**
  ******************************************************************************
  * @file           : mb85rs64.h
  * @brief          : his file contains the common defines of the application.
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MB85RS64_H
#define __MB85RS64_H

#include <stdint.h>

#define FRAM_SPI                 SPI1

#define FRAM_SCK_Pin             LL_GPIO_PIN_5
#define FRAM_SCK_GPIO_Port       GPIOA

#define FRAM_MISO_Pin            LL_GPIO_PIN_6
#define FRAM_MISO_GPIO_Port      GPIOA

#define FRAM_MOSI_Pin            LL_GPIO_PIN_7
#define FRAM_MOSI_GPIO_Port      GPIOA

#define FRAM_CS_Pin              GPIO_PIN_4
#define FRAM_CS_LL_Pin           LL_GPIO_PIN_4
#define FRAM_CS_GPIO_Port        GPIOA
#define mb85rs64_deselect()      (FRAM_CS_GPIO_Port->BSRR = (uint32_t)FRAM_CS_Pin)
#define mb85rs64_select()        (FRAM_CS_GPIO_Port->BSRR = ((uint32_t)FRAM_CS_Pin << 16U))

typedef enum
{ 
  MB85RS64_OPCODE_WREN  = 0x06,  /*!< 置位写使能锁存器  */
  MB85RS64_OPCODE_WRDI  = 0x04,  /*!< 复位写使能锁存器  */
  MB85RS64_OPCODE_RDSR  = 0x05,  /*!< 读状态寄存器  */
  MB85RS64_OPCODE_WRSR  = 0x05,  /*!< 写状态寄存器  */
  MB85RS64_OPCODE_READ  = 0x03,  /*!< 读内存  */
  MB85RS64_OPCODE_WRITE = 0x02,  /*!< 写内存  */
  MB85RS64_OPCODE_RDID  = 0x9F,  /*!< 读器件ID  */
}MB85RS64_OpcodeEnum;

/** 
  * @brief  MB85RS64块写保护范围枚举定义
  */ 
typedef enum
{ 
  MB85RS64_BP_NON     = 0x00, /*!< 无保护 */
  MB85RS64_BP_QUARTER = 0x04, /*!< 保护高1/4，0x1800 - 0x1FFF */
  MB85RS64_BP_HALF    = 0x08, /*!< 保护高1/2，0x1000 - 0x1FFF */
  MB85RS64_BP_ALL     = 0x0C  /*!< 保护全部， 0x0000 - 0x1FFF */
}MB85RS64_BpEnum;

/**
  * @brief  读取mb85rs64的状态寄存器
  * @param  无
  * @retval 状态寄存器值
  */
extern uint8_t  mb85rs64_read_status_reg(void);

/**
  * @brief  写mb85rs64的状态寄存器
  * @param  u8Val: 要写入的值
  * @retval 无
  */
extern void mb85rs64_write_status_reg(uint8_t value);

/**
  * @brief  设置mb85rs64的块保护范围
  * @param  BPsize: 设置写入保护的范围.可以是以下值之一：
    @arg    mb85rs64_BP_NON      :  无保护
    @arg    mb85rs64_BP_QUARTER  : 保护高1/4，0x1800 - 0x1FFF
    @arg    mb85rs64_BP_HALF    : 保护高1/2，0x1000 - 0x1FFF
    @arg    mb85rs64_BP_ALL      : 保护全部， 0x0000 - 0x1FFF
  * @retval 无
  */
extern void mb85rs64_set_bp(MB85RS64_BpEnum bpsize);

/**
  * @brief  从MB85RS64的FRAM读取1字节数据
  * @param  u16Address: 数据所在地址
  * @retval 读出的值
  */
extern uint8_t mb85rs64_read_one_byte(uint16_t address);

/**
  * @brief  从MB85RS64的FRAM读取2字节数据
  * @param  u16Address: 数据所在地址
  * @retval 读出的值
  */
extern uint16_t mb85rs64_read_two_byte(uint16_t address);

/**
  * @brief  从MB85RS64的FRAM读取4字节数据
  * @param  u16Address: 数据所在地址
  * @retval 读出的值
  */
extern uint32_t mb85rs64_read_four_byte(uint16_t address);

/**
  * @brief  从MB85RS64的FRAM读取任意字节数量的数据
  * @param  address: 数据所在地址
  * @param  rdat: 待写入数据指针
  * @param  len:  待写入数据长度
  * @retval 读出的值
  */
extern uint8_t mb85rs64_read_bytes(uint16_t address, uint8_t *rdat, uint16_t len);

/**
  * @brief  向MB85RS64的FRAM写入1字节数据
  * @param  u16Address: 数据所在地址
  * @param  u8Data: 数据
  * @retval 无
  */
extern void mb85rs64_write_one_byte(uint16_t address, uint8_t wdat);

/**
  * @brief  向MB85RS64的FRAM写入2字节数据
  * @param  u16Address: 数据所在地址
  * @param  u16Data: 数据
  * @retval 无
  */
extern void mb85rs64_write_two_byte(uint16_t address, uint16_t wdat);

/**
  * @brief  向MB85RS64的FRAM写入4字节数据
  * @param  u16Address: 数据所在地址
  * @param  u32Data: 数据
  * @retval 无
  */
extern void mb85rs64_write_four_byte(uint16_t address, uint32_t wdat);

/**
  * @brief  向MB85RS64的FRAM写入任意字节数据
  * @param  address: 数据所在地址
  * @param  wdat: 写入数据
  * @param  len:  数据长度
  * @retval 无
  */
extern uint8_t mb85rs64_write_bytes(uint16_t address, const uint8_t *wdat, uint16_t len);
  
/**
 * @brief  初始化MB85RS64
 * @param  无
 * @retval 无
 */
extern void mb85rs64_init(void);

#endif /* __MB85RS64_H */
